home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / usenet / volume4 / rubik.shr < prev   
Encoding:
Internet Message Format  |  1988-05-20  |  27.3 KB

  1. Path: uunet!husc6!bloom-beacon!mit-eddie!uw-beaver!tektronix!tekgen!tekred!games
  2. From: games@tekred.TEK.COM
  3. Newsgroups: comp.sources.games
  4. Subject: v04i014:  rubik - Rubik's Cube Simulator in Pascal for VAX/VMS
  5. Message-ID: <2542@tekred.TEK.COM>
  6. Date: 20 May 88 22:31:56 GMT
  7. Sender: billr@tekred.TEK.COM
  8. Lines: 910
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted by: uunet!bsu-cs!starcat (Bud Crittenden)
  12. Comp.sources.games: Volume 4, Issue 14
  13. Archive-name: rubik.shr
  14.  
  15.     [I haven't tried this, so you're on your own.  -br]
  16.  
  17. [[Here it is...  It has some open spots for the compiler to chose (such as 
  18. the ending, and whether or not the cube is checked for being solved).]]
  19.  
  20. #! /bin/sh
  21. # This is a shell archive.  Remove anything before this line, then unpack
  22. # it by saving it into a file and typing "sh file".  To overwrite existing
  23. # files, type "sh file -c".  You can also feed this as standard input via
  24. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  25. # will see the following message at the end:
  26. #        "End of shell archive."
  27. # Contents:  cube.pas
  28. # Wrapped by billr@saab on Fri May 20 15:02:03 1988
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f cube.pas -a "${1}" != "-c" ; then 
  31.   echo shar: Will not over-write existing file \"cube.pas\"
  32. else
  33. echo shar: Extracting \"cube.pas\" \(25565 characters\)
  34. sed "s/^X//" >cube.pas <<'END_OF_cube.pas'
  35. X[INHERIT ('SYS$LIBRARY:STARLET.PEN')]
  36. X(* Rubik's cube simulator for VAX/VMS and ReGIS graphics *)
  37. X(*        by Bud Crittendon             *)
  38. X
  39. XPROGRAM CUBE(INPUT,OUTPUT,OUTFILE);
  40. X
  41. XConst
  42. X  CubeSize = 35;
  43. X  CubeSep =   CubeSize + 6;
  44. X  CubeCornerX = 200;  
  45. X  CubeCornerY = 200;  
  46. X  TiltAngle = 0.5235987;
  47. X  ColorRed = 1;
  48. X  ColorBlue = 2;
  49. X  ColorYellow = 3;
  50. X
  51. XTYPE
  52. X  Iword       = [WORD] 0..65535;
  53. X  ShortString = PACKED ARRAY [1..12] OF CHAR;
  54. X  Rotate      = (NONE,LEFT,RIGHT,UP,DOWN,FRONT,BACK);
  55. X  Where       = (TILTFRONT,TILTTOP,TILTRIGHT,TILTLEFT,TILTDOWN,TILTBACK);
  56. X  Colors      = (YELLOW,WHITE,BLUE,GREEN,RED,ORANGE);
  57. X  CUBITS = PACKED ARRAY [1..9] OF COLORS;
  58. X  CUBES = PACKED ARRAY [LEFT..BACK] OF CUBITS;
  59. X
  60. XVAR 
  61. X  X,
  62. X  Y,
  63. X  L,
  64. X  C1,
  65. X  C2,
  66. X  CUBESEPX,
  67. X  CUBESEPY,
  68. X  CUBEADJX,
  69. X  CUBEADJY,
  70. X  SCORE,
  71. X  MIXES,
  72. X  MOVES,
  73. X  CUBEADJUST,
  74. X  DIR,
  75. X  I:INTEGER;
  76. X  QUIT,
  77. X  DONE:BOOLEAN;
  78. X  CUBEARRAY:CUBES;
  79. X  CCOLOR,
  80. X  COLOR:COLORS;
  81. X  CTYPE,
  82. X  CUBEPLACE:WHERE;
  83. X  TURN:ROTATE;
  84. X  KEY:CHAR;
  85. X  IOCHAN:IWORD;
  86. X  OUTFILE:TEXT;
  87. X
  88. X(******************************************************************************)
  89. X
  90. X[INITIALIZE]
  91. XPROCEDURE InitializeCubeParams;
  92. X  BEGIN
  93. X    WRITELN(CHR(27),'P1p');
  94. X    WRITELN('S(M0(AD)M1(AR)M2(AB)M3(AY))');
  95. X    WRITELN('l(a2)"A"55aa55aa55aa55aa55aa;');
  96. X    WRITELN(CHR(27),'\');
  97. X
  98. X    FOR I := 1 TO 9 DO BEGIN
  99. X      CUBEARRAY[RIGHT][I] := YELLOW;
  100. X      CUBEARRAY[LEFT][I]  := WHITE;
  101. X      CUBEARRAY[UP][I]    := BLUE;
  102. X      CUBEARRAY[DOWN][I]  := GREEN;
  103. X      CUBEARRAY[FRONT][I] := RED;
  104. X      CUBEARRAY[BACK][I]  := ORANGE;
  105. X      END;
  106. X    DONE  := FALSE;
  107. X    QUIT  := FALSE;
  108. X    MOVES := 0;
  109. X    MIXES := 0;
  110. X    SCORE := 0;
  111. X    CubeAdjX := round(CubeSize * cos(TiltAngle));
  112. X    CubeAdjY := round(CubeSize * sin(TiltAngle));
  113. X    CubeSepX := round(CubeSep  * cos(TiltAngle));
  114. X    CubeSepY := round(CubeSep  * sin(TiltAngle));
  115. X  END;
  116. X
  117. X(******************************************************************************)
  118. X
  119. XPROCEDURE Initialize(VAR CUBEARRAY:CUBES;VAR MIXES,MOVES,SCORE:INTEGER);
  120. X
  121. XBEGIN
  122. X    FOR I := 1 TO 9 DO BEGIN
  123. X      CUBEARRAY[RIGHT][I] := YELLOW;
  124. X      CUBEARRAY[LEFT][I]  := WHITE;
  125. X      CUBEARRAY[UP][I]    := BLUE;
  126. X      CUBEARRAY[DOWN][I]  := GREEN;
  127. X      CUBEARRAY[FRONT][I] := RED;
  128. X      CUBEARRAY[BACK][I]  := ORANGE;
  129. X      END;
  130. X    MOVES := 0;
  131. X    MIXES := 0;
  132. X    SCORE := 0;
  133. X  END;
  134. X
  135. X(******************************************************************************)
  136. X
  137. XPROCEDURE REGIS;
  138. X
  139. XBEGIN
  140. X  WRITELN(CHR(27),'Pp');
  141. XEND;
  142. X
  143. X(******************************************************************************)
  144. X
  145. XPROCEDURE ASCII;
  146. X
  147. XBEGIN
  148. X  WRITELN(CHR(27),'[;H');
  149. X  WRITELN(CHR(27),'\');
  150. XEND;
  151. X
  152. X(******************************************************************************)
  153. X
  154. XPROCEDURE POSITION(ROW,COL:INTEGER);
  155. X
  156. XBEGIN
  157. X  WRITELN('P[',COL:1,',',ROW:1,']');
  158. XEND;
  159. X
  160. X(******************************************************************************)
  161. X
  162. XPROCEDURE RANDOMNUMBER(VAR RANDOM:INTEGER;MINVALUE,MAXVALUE:INTEGER);
  163. X
  164. XTYPE
  165. X  STRING = PACKED ARRAY [1..11] OF CHAR;
  166. X
  167. XVAR
  168. X  CURTIME : STRING;
  169. X  SEED : INTEGER;
  170. X
  171. XBEGIN
  172. X  CURTIME := '00:00:00.00';
  173. X  TIME(CURTIME);
  174. X  RANDOM := 0;
  175. X  SEED := 0;
  176. X  SEED := SEED + 1 * (ORD(CURTIME[10])-48);
  177. X  SEED := SEED + 10 * (ORD(CURTIME[11])-48);
  178. X  RANDOM := ROUND((SEED/99) * (MAXVALUE - MINVALUE)) + MINVALUE;
  179. XEND;
  180. X
  181. X(******************************************************************************)
  182. XPROCEDURE Coords ( VAR CubeNumber: integer;  VAR CubeType: Where);
  183. X  VAR bx,by,ccx,ccy:integer;
  184. X  BEGIN
  185. X    bx := (CubeNumber-1) MOD 3;
  186. X    by := (CubeNumber-1) DIV 3;
  187. X    CASE CubeType OF
  188. X      TILTFRONT,
  189. X      TILTRIGHT,
  190. X      TILTTOP: BEGIN
  191. X                 ccx := CubeCornerX;
  192. X                 ccy := CubeCornerY;
  193. X               END;
  194. X      TILTBACK: BEGIN
  195. X                  ccx := CubeCornerX + CubeSepX*7;
  196. X                  ccy := CubeCornerY - CubeSepy*7;
  197. X                END;
  198. X      TILTLEFT: BEGIN
  199. X                  ccx := CubeCornerX - CubeSepX*7;
  200. X                  ccy := CubeCornerY;
  201. X                END;
  202. X      TILTDOWN: BEGIN
  203. X                  ccx := CubeCornerX;
  204. X                  ccy := CubeCornerY + CubeSepY*10;
  205. X                END;
  206. X      OTHERWISE;
  207. X      END;
  208. X    CASE CubeType OF
  209. X      TILTFRONT,TILTBACK: 
  210. X             BEGIN
  211. X               x := ccx + bx * CubeSep  ;
  212. X               y := ccy + by * CubeSep  ;
  213. X             END;
  214. X      TILTRIGHT,TILTLEFT:
  215. X             BEGIN
  216. X               x := ccx + (CubeSep  * 3) + (bx * CubeSepX);
  217. X               y := ccy + (CubeSep  * by) - (bx * CubeSepY); 
  218. X             END;
  219. X      TILTTOP,TILTDOWN:
  220. X             BEGIN
  221. X               x := ccx + (CubeSepX *3) + (bx*CubeSep) - (by*CubeSepX);
  222. X               y := ccy - (CubeSepY *3) + (by*CubeSepY);
  223. X             END;
  224. X      END;
  225. X  END;
  226. X
  227. X(******************************************************************************)
  228. X
  229. XPROCEDURE SetColor(VAR Color: Colors);
  230. X  BEGIN
  231. X    CASE Color OF
  232. X      RED : BEGIN
  233. X              c1 := ColorRed;
  234. X              c2 := ColorRed;
  235. X            END;
  236. X      YELLOW: 
  237. X            BEGIN
  238. X              c1 := ColorYellow;
  239. X              c2 := ColorYellow;
  240. X            END;
  241. X      BLUE:
  242. X            BEGIN
  243. X              c1 := ColorBlue;
  244. X              c2 := ColorBlue;
  245. X            END;
  246. X      ORANGE:
  247. X            BEGIN 
  248. X              c1 := ColorRed;
  249. X              c2 := ColorYellow;
  250. X            END;
  251. X      WHITE:
  252. X            BEGIN
  253. X              c1 := ColorBlue;
  254. X              c2 := ColorYellow;
  255. X            END;
  256. X      GREEN:
  257. X            BEGIN
  258. X              c1 := ColorBlue;
  259. X              c2 := ColorRed;
  260. X            END;
  261. X      END;
  262. X  END;
  263. X
  264. X(******************************************************************************)
  265. X
  266. XPROCEDURE SetFill(VAR CubeType: Where);
  267. X  VAR solid : boolean;
  268. X  BEGIN
  269. X    solid := (c1 = c2);
  270. X    Write('w(r,i',c1:1,',s');
  271. X    IF solid 
  272. X      THEN
  273. X        BEGIN
  274. X          CASE CubeType OF
  275. X            TILTBACK,TILTLEFT,TILTFRONT,TILTRIGHT: Writeln('1)');
  276. X                                 TILTDOWN,TILTTOP: Writeln('1(x))');
  277. X            END;
  278. X        END
  279. X      ELSE
  280. X        BEGIN
  281. X          CASE CubeType OF
  282. X             TILTBACK,TILTLEFT,TILTFRONT,TILTRIGHT: Writeln('"A")s(i',c2:1,')');
  283. X                               TILTDOWN,TILTTOP: Writeln('"A"(x))s(i',c2:1,')');
  284. X             END;
  285. X        END;
  286. X  END;
  287. X
  288. X(******************************************************************************)
  289. X
  290. XPROCEDURE Square (CubeNumber: integer;
  291. X                  CubeType: Where; Color: Colors);
  292. X
  293. X  BEGIN
  294. X    Coords(CubeNumber,CubeType);  (* Compute X,Y *)
  295. X    Writeln('p[',x,',',y,']t(a2)');   (* Place cursor at x,y *)
  296. X    SetColor(Color);             (* Select c1 and c2 *)
  297. X    CASE CubeType OF
  298. X          TILTFRONT,TILTBACK:
  299. X            BEGIN
  300. X              SetFill(CubeType);
  301. X              Writeln('v[,+',cubesize,'][+',cubesize,']');
  302. X            END;
  303. X      TILTRIGHT,TILTLEFT:
  304. X          BEGIN
  305. X             SetFill(CubeType);
  306. X             Writeln('v[,+',cubesize,'][+',CubeAdjX,
  307. X                     ',-',CubeAdjY,']');
  308. X             Writeln('v[,-',cubesize,'][-',CubeAdjX,
  309. X                     ',+',CubeAdjY,']')
  310. X          END;
  311. X        TILTTOP,TILTDOWN:
  312. X          BEGIN
  313. X             SetFill(CubeType);
  314. X             Writeln('v[-',CubeAdjX,',+',CubeAdjY,
  315. X                     '][+',Cubesize,']');
  316. X             Writeln('v[+',CubeAdjX,',-',CubeadjY,']');
  317. X           END;
  318. X    END;
  319. X  Writeln('w(s0)s(i0)t(a0)');
  320. X END;
  321. X
  322. X(******************************************************************************)
  323. X
  324. XPROCEDURE OPENKEY;
  325. X  VAR
  326. X    STAT : IWORD;
  327. X    DEVNAME: SHORTSTRING;
  328. X  BEGIN
  329. X    DEVNAME := 'TT:';
  330. X    STAT := $ASSIGN(DEVNAME,IOCHAN);
  331. X  END;
  332. X
  333. X(******************************************************************************)
  334. X
  335. XPROCEDURE SHUTKEY;
  336. X  VAR 
  337. X    STAT : IWORD;
  338. X  BEGIN
  339. X    STAT := $DASSGN(IOCHAN);
  340. X  END;
  341. X
  342. X(******************************************************************************)
  343. X  
  344. XFUNCTION GETKEY:CHAR;
  345. X  VAR
  346. X    FUNC,STAT : IWORD;
  347. X    CH : CHAR;
  348. X  BEGIN
  349. X    FUNC := IO$_READVBLK + IO$M_NOECHO + IO$M_NOFILTR;
  350. X    STAT := $QIOW (,IOCHAN,FUNC,,,,CH,1);
  351. X    GETKEY := CH;
  352. X  END;
  353. X
  354. X(******************************************************************************)
  355. X
  356. XPROCEDURE SIDES(TURN:ROTATE);
  357. X
  358. XBEGIN
  359. X  CASE TURN OF 
  360. X    FRONT : FOR I := 1 TO 3 DO BEGIN
  361. X              SQUARE(I,TILTFRONT,CUBEARRAY[FRONT][I]);
  362. X              SQUARE(I+3,TILTFRONT,CUBEARRAY[FRONT][I+3]);
  363. X              SQUARE(I+6,TILTFRONT,CUBEARRAY[FRONT][I+6]);
  364. X              SQUARE((I+6),TILTTOP,CUBEARRAY[UP][I+6]);
  365. X              SQUARE(((I*3)-2),TILTRIGHT,CUBEARRAY[RIGHT][((I*3)-2)]);
  366. X              SQUARE((I+6),TILTDOWN,CUBEARRAY[DOWN][I]);
  367. X              SQUARE(((I*3)-2),TILTLEFT,CUBEARRAY[LEFT][(I*3)]);
  368. X              END;
  369. X    RIGHT : FOR I := 1 TO 3 DO BEGIN
  370. X              SQUARE(I,TILTRIGHT,CUBEARRAY[RIGHT][I]);
  371. X              SQUARE(I+3,TILTRIGHT,CUBEARRAY[RIGHT][I+3]);
  372. X              SQUARE(I+6,TILTRIGHT,CUBEARRAY[RIGHT][I+6]);
  373. X              SQUARE((I*3),TILTTOP,CUBEARRAY[UP][I*3]);
  374. X              SQUARE((I*3),TILTFRONT,CUBEARRAY[FRONT][(I*3)]);
  375. X              SQUARE((I*3),TILTDOWN,CUBEARRAY[DOWN][((4-I)*3)]);
  376. X              SQUARE((I*3),TILTBACK,CUBEARRAY[BACK][((I*3)-2)]);
  377. X              END;
  378. X    UP    : FOR I := 1 TO 3 DO BEGIN
  379. X              SQUARE(I,TILTTOP,CUBEARRAY[UP][I]);
  380. X              SQUARE(I+3,TILTTOP,CUBEARRAY[UP][I+3]);
  381. X              SQUARE(I+6,TILTTOP,CUBEARRAY[UP][I+6]);
  382. X              SQUARE(I,TILTFRONT,CUBEARRAY[FRONT][I]);
  383. X              SQUARE(I,TILTRIGHT,CUBEARRAY[RIGHT][I]);
  384. X              SQUARE(I,TILTLEFT,CUBEARRAY[LEFT][(4-I)]);
  385. X              SQUARE(I,TILTBACK,CUBEARRAY[BACK][(4-I)]);
  386. X              END;
  387. X    BACK  : FOR I := 1 TO 3 DO BEGIN
  388. X              SQUARE(I,TILTBACK,CUBEARRAY[BACK][(4-I)]);
  389. X              SQUARE(I+3,TILTBACK,CUBEARRAY[BACK][(4-I)+3]);
  390. X              SQUARE(I+6,TILTBACK,CUBEARRAY[BACK][(4-I)+6]);
  391. X              SQUARE(I,TILTTOP,CUBEARRAY[UP][I]);
  392. X              SQUARE((I*3),TILTRIGHT,CUBEARRAY[RIGHT][(I*3)]);
  393. X              SQUARE((I*3),TILTLEFT,CUBEARRAY[LEFT][((I*3)-2)]);
  394. X              SQUARE(I,TILTDOWN,CUBEARRAY[DOWN][(I+6)]);
  395. X              END;
  396. X    LEFT  : FOR I := 1 TO 3 DO BEGIN
  397. X              SQUARE(I,TILTLEFT,CUBEARRAY[LEFT][(4-I)]);
  398. X              SQUARE(I+3,TILTLEFT,CUBEARRAY[LEFT][(4-I)+3]);
  399. X              SQUARE(I+6,TILTLEFT,CUBEARRAY[LEFT][(4-I)+6]);
  400. X              SQUARE(((I*3)-2),TILTTOP,CUBEARRAY[UP][((I*3)-2)]);
  401. X              SQUARE(((I*3)-2),TILTFRONT,CUBEARRAY[FRONT][((I*3)-2)]);
  402. X              SQUARE(((I*3)-2),TILTBACK,CUBEARRAY[BACK][(I*3)]);
  403. X              SQUARE(((I*3)-2),TILTDOWN,CUBEARRAY[DOWN][(((4-I)*3)-2)]);
  404. X              END;
  405. X    DOWN  : FOR I := 1 TO 3 DO BEGIN
  406. X              SQUARE(I+6,TILTDOWN,CUBEARRAY[DOWN][I]);
  407. X              SQUARE(I+3,TILTDOWN,CUBEARRAY[DOWN][I+3]);
  408. X              SQUARE(I,TILTDOWN,CUBEARRAY[DOWN][(I+6)]);
  409. X              SQUARE((I+6),TILTFRONT,CUBEARRAY[FRONT][(I+6)]);
  410. X              SQUARE((I+6),TILTRIGHT,CUBEARRAY[RIGHT][(I+6)]);
  411. X              SQUARE((I+6),TILTBACK,CUBEARRAY[BACK][((4-I)+6)]);
  412. X              SQUARE((I+6),TILTLEFT,CUBEARRAY[LEFT][((4-I)+6)]);
  413. X              END;
  414. X    END;
  415. XEND;
  416. X
  417. X(******************************************************************************)
  418. X
  419. XPROCEDURE TURNSIDE(TURN:ROTATE;DIR:INTEGER);
  420. X
  421. XVAR
  422. X  NUMBER:INTEGER;
  423. X  TEMP:COLORS;
  424. X
  425. XBEGIN
  426. X  FOR NUMBER := 1 TO DIR DO BEGIN
  427. X    TEMP               := CUBEARRAY[TURN][1];
  428. X    CUBEARRAY[TURN][1] := CUBEARRAY[TURN][7];
  429. X    CUBEARRAY[TURN][7] := CUBEARRAY[TURN][9];
  430. X    CUBEARRAY[TURN][9] := CUBEARRAY[TURN][3];
  431. X    CUBEARRAY[TURN][3] := TEMP;
  432. X    TEMP               := CUBEARRAY[TURN][2];
  433. X    CUBEARRAY[TURN][2] := CUBEARRAY[TURN][4];
  434. X    CUBEARRAY[TURN][4] := CUBEARRAY[TURN][8];
  435. X    CUBEARRAY[TURN][8] := CUBEARRAY[TURN][6];
  436. X    CUBEARRAY[TURN][6] := TEMP;
  437. X    END;
  438. XEND;
  439. X
  440. X(******************************************************************************)
  441. X
  442. XPROCEDURE CHANGEARRAY(VAR CUBEARRAY:CUBES;TURN:ROTATE;DIR:INTEGER);
  443. X
  444. XVAR
  445. X  TEMPARRAY : PACKED ARRAY [1..3] OF COLORS;
  446. X  TEMP:COLORS;
  447. X  J,
  448. X  X,
  449. X  Y:INTEGER;
  450. X
  451. XBEGIN
  452. X  TURNSIDE(TURN,DIR);
  453. X  FOR X := 1 TO DIR DO BEGIN
  454. X    IF (TURN = UP) THEN
  455. X      FOR J := 1 TO 3 DO BEGIN
  456. X        TEMP                := CUBEARRAY[FRONT][J];
  457. X        CUBEARRAY[FRONT][J] := CUBEARRAY[RIGHT][J];
  458. X        CUBEARRAY[RIGHT][J] := CUBEARRAY[BACK][J];
  459. X        CUBEARRAY[BACK][J]  := CUBEARRAY[LEFT][J];
  460. X        CUBEARRAY[LEFT][J]  := TEMP;
  461. X        END;
  462. X    IF (TURN = DOWN) THEN
  463. X      FOR J := 1 TO 3 DO BEGIN
  464. X        TEMP                  := CUBEARRAY[FRONT][J+6];
  465. X        CUBEARRAY[FRONT][J+6] := CUBEARRAY[LEFT][J+6];
  466. X        CUBEARRAY[LEFT][J+6]  := CUBEARRAY[BACK][J+6];
  467. X        CUBEARRAY[BACK][J+6]  := CUBEARRAY[RIGHT][J+6];
  468. X        CUBEARRAY[RIGHT][J+6] := TEMP;
  469. X        END;
  470. X    IF (TURN = RIGHT) THEN
  471. X      FOR J := 1 TO 3 DO BEGIN
  472. X        TEMP                      := CUBEARRAY[FRONT][(4-J)*3];
  473. X        CUBEARRAY[FRONT][(4-J)*3] := CUBEARRAY[DOWN][(4-J)*3];
  474. X        CUBEARRAY[DOWN][(4-J)*3]  := CUBEARRAY[BACK][(J*3)-2];
  475. X        CUBEARRAY[BACK][(J*3)-2]  := CUBEARRAY[UP][(4-J)*3];
  476. X        CUBEARRAY[UP][(4-J)*3]    := TEMP;
  477. X        END;
  478. X    IF (TURN = LEFT) THEN 
  479. X      FOR J := 1 TO 3 DO BEGIN
  480. X        TEMP                       := CUBEARRAY[FRONT][(J*3)-2];
  481. X        CUBEARRAY[FRONT][(J*3)-2]  := CUBEARRAY[UP][(J*3)-2];
  482. X        CUBEARRAY[UP][(J*3)-2]     := CUBEARRAY[BACK][(4-J)*3];
  483. X        CUBEARRAY[BACK][(4-J)*3]   := CUBEARRAY[DOWN][(J*3)-2];
  484. X        CUBEARRAY[DOWN][(J*3)-2]   := TEMP;
  485. X        END;
  486. X    IF (TURN = FRONT) THEN 
  487. X      FOR J := 1 TO 3 DO BEGIN
  488. X        TEMP                       := CUBEARRAY[UP][J+6];
  489. X        CUBEARRAY[UP][J+6]         := CUBEARRAY[LEFT][(4-J)*3];
  490. X        CUBEARRAY[LEFT][(4-J)*3]   := CUBEARRAY[DOWN][(4-J)];
  491. X        CUBEARRAY[DOWN][(4-J)]     := CUBEARRAY[RIGHT][(J*3)-2];
  492. X        CUBEARRAY[RIGHT][(J*3)-2]  := TEMP
  493. X        END;
  494. X    IF (TURN = BACK) THEN
  495. X      FOR J := 1 TO 3 DO BEGIN
  496. X        TEMP                      := CUBEARRAY[UP][4-J];
  497. X        CUBEARRAY[UP][4-J]        := CUBEARRAY[RIGHT][(4-J)*3];
  498. X        CUBEARRAY[RIGHT][(4-J)*3] := CUBEARRAY[DOWN][J+6];
  499. X        CUBEARRAY[DOWN][J+6]      := CUBEARRAY[LEFT][(J*3)-2];
  500. X        CUBEARRAY[LEFT][(J*3)-2]  := TEMP
  501. X        END;
  502. X    END;
  503. XEND;
  504. X
  505. X(******************************************************************************)
  506. X
  507. XPROCEDURE DRAWCUBE;
  508. X
  509. XVAR
  510. X  I : INTEGER;
  511. X
  512. XBEGIN
  513. X  FOR I := 1 TO 3 DO BEGIN
  514. X    SQUARE(I,TILTTOP,CUBEARRAY[UP][I]);
  515. X    SQUARE(I+3,TILTTOP,CUBEARRAY[UP][I+3]);
  516. X    SQUARE(I+6,TILTTOP,CUBEARRAY[UP][I+6]);
  517. X    SQUARE(I,TILTFRONT,CUBEARRAY[FRONT][I]);
  518. X    SQUARE(I+3,TILTFRONT,CUBEARRAY[FRONT][I+3]);
  519. X    SQUARE(I+6,TILTFRONT,CUBEARRAY[FRONT][I+6]);
  520. X    SQUARE(I,TILTRIGHT,CUBEARRAY[RIGHT][I]);
  521. X    SQUARE(I+3,TILTRIGHT,CUBEARRAY[RIGHT][I+3]);
  522. X    SQUARE(I+6,TILTRIGHT,CUBEARRAY[RIGHT][I+6]);
  523. X    SQUARE(I,TILTBACK,CUBEARRAY[BACK][(4-I)]);
  524. X    SQUARE(I+3,TILTBACK,CUBEARRAY[BACK][(4-I)+3]);
  525. X    SQUARE(I+6,TILTBACK,CUBEARRAY[BACK][(4-I)+6]);
  526. X    SQUARE(I,TILTLEFT,CUBEARRAY[LEFT][(4-I)]);
  527. X    SQUARE(I+3,TILTLEFT,CUBEARRAY[LEFT][(4-I)+3]);
  528. X    SQUARE(I+6,TILTLEFT,CUBEARRAY[LEFT][(4-I)+6]);
  529. X    SQUARE(I,TILTDOWN,CUBEARRAY[DOWN][I+6]);
  530. X    SQUARE(I+3,TILTDOWN,CUBEARRAY[DOWN][I+3]);
  531. X    SQUARE(I+6,TILTDOWN,CUBEARRAY[DOWN][I]);
  532. X    END;
  533. XEND;
  534. X
  535. X(******************************************************************************)
  536. X
  537. XPROCEDURE TURNCUBE(VAR CUBEARRAY:CUBES;TURN:ROTATE);
  538. X
  539. XVAR
  540. X  TEMPARRAY : PACKED ARRAY [1..9] OF COLORS;
  541. X  J:INTEGER;
  542. X
  543. XBEGIN
  544. X  CASE TURN OF 
  545. X    UP    : BEGIN
  546. X              TURNSIDE(RIGHT,1);
  547. X              TURNSIDE(LEFT,3);
  548. X              FOR J := 1 TO 9 DO BEGIN
  549. X                TEMPARRAY[J]          := CUBEARRAY[UP][J];
  550. X                CUBEARRAY[UP][J]      := CUBEARRAY[FRONT][J];
  551. X                CUBEARRAY[FRONT][J]   := CUBEARRAY[DOWN][J];
  552. X                CUBEARRAY[DOWN][J]    := CUBEARRAY[BACK][10-J];
  553. X                CUBEARRAY[BACK][10-J] := TEMPARRAY[J];
  554. X                END;
  555. X              END;
  556. X    DOWN  : BEGIN
  557. X              TURNSIDE(RIGHT,3);
  558. X              TURNSIDE(LEFT,1);
  559. X              FOR J := 1 TO 9 DO BEGIN
  560. X                TEMPARRAY[J]          := CUBEARRAY[UP][J];
  561. X                CUBEARRAY[UP][J]      := CUBEARRAY[BACK][10-J];
  562. X                CUBEARRAY[BACK][10-J] := CUBEARRAY[DOWN][J];
  563. X                CUBEARRAY[DOWN][J]    := CUBEARRAY[FRONT][J];
  564. X                CUBEARRAY[FRONT][J]   := TEMPARRAY[J];
  565. X                END;
  566. X              END;
  567. X    RIGHT : BEGIN
  568. X              TURNSIDE(UP,3);
  569. X              TURNSIDE(DOWN,1);
  570. X              FOR J := 1 TO 9 DO BEGIN
  571. X                TEMPARRAY[J]          := CUBEARRAY[FRONT][J];
  572. X                CUBEARRAY[FRONT][J]   := CUBEARRAY[LEFT][J];
  573. X                CUBEARRAY[LEFT][J]    := CUBEARRAY[BACK][J];
  574. X                CUBEARRAY[BACK][J]    := CUBEARRAY[RIGHT][J];
  575. X                CUBEARRAY[RIGHT][J]   := TEMPARRAY[J];
  576. X                END;
  577. X              END;
  578. X    LEFT  : BEGIN
  579. X              TURNSIDE(UP,1);
  580. X              TURNSIDE(DOWN,3);
  581. X              FOR J := 1 TO 9 DO BEGIN
  582. X                TEMPARRAY[J]          := CUBEARRAY[FRONT][J];
  583. X                CUBEARRAY[FRONT][J]   := CUBEARRAY[RIGHT][J];
  584. X                CUBEARRAY[RIGHT][J]   := CUBEARRAY[BACK][J];
  585. X                CUBEARRAY[BACK][J]    := CUBEARRAY[LEFT][J];
  586. X                CUBEARRAY[LEFT][J]    := TEMPARRAY[J];
  587. X                END;
  588. X              END;
  589. X    END;
  590. X  DRAWCUBE;
  591. XEND;
  592. X
  593. X(******************************************************************************)
  594. X
  595. XPROCEDURE LOADCUBE(VAR CUBEARRAY:CUBES;VAR MOVES,MIXES:INTEGER);
  596. X
  597. XBEGIN
  598. X  OPEN (FILE_NAME     := 'SYS$LOGIN:CUBE.DAT',
  599. X        FILE_VARIABLE := OUTFILE,
  600. X        HISTORY       := OLD,
  601. X        ACCESS_METHOD := SEQUENTIAL);
  602. X  RESET(OUTFILE);
  603. X  FOR I := 1 TO 9 DO BEGIN
  604. X    READLN(OUTFILE,CUBEARRAY[RIGHT][I]);
  605. X    READLN(OUTFILE,CUBEARRAY[LEFT][I]);
  606. X    READLN(OUTFILE,CUBEARRAY[UP][I]);
  607. X    READLN(OUTFILE,CUBEARRAY[DOWN][I]);
  608. X    READLN(OUTFILE,CUBEARRAY[FRONT][I]);
  609. X    READLN(OUTFILE,CUBEARRAY[BACK][I]);
  610. X    END;
  611. X    READLN(OUTFILE,MOVES,MIXES);
  612. X  CLOSE(OUTFILE);
  613. XEND;
  614. X
  615. X(******************************************************************************)
  616. X
  617. XPROCEDURE SAVECUBE;
  618. X
  619. XBEGIN
  620. X  OPEN (FILE_NAME     := 'SYS$LOGIN:CUBE.DAT',
  621. X        FILE_VARIABLE := OUTFILE,
  622. X        HISTORY       := NEW,
  623. X        ACCESS_METHOD := SEQUENTIAL);
  624. X  REWRITE(OUTFILE);
  625. X  FOR I := 1 TO 9 DO BEGIN
  626. X    WRITELN(OUTFILE,CUBEARRAY[RIGHT][I]);
  627. X    WRITELN(OUTFILE,CUBEARRAY[LEFT][I]);
  628. X    WRITELN(OUTFILE,CUBEARRAY[UP][I]);
  629. X    WRITELN(OUTFILE,CUBEARRAY[DOWN][I]);
  630. X    WRITELN(OUTFILE,CUBEARRAY[FRONT][I]);
  631. X    WRITELN(OUTFILE,CUBEARRAY[BACK][I]);
  632. X    END;
  633. X   WRITELN(OUTFILE,MOVES,MIXES);
  634. X   CLOSE(OUTFILE);
  635. XEND;
  636. X
  637. X(******************************************************************************)
  638. X
  639. XPROCEDURE WRITEMOVES(MOVES:INTEGER);
  640. X
  641. XBEGIN
  642. X  POSITION(50,50);
  643. X  WRITELN('T''Moves : ',MOVES:1,' '' ');
  644. XEND;
  645. X
  646. X(******************************************************************************)
  647. X
  648. XPROCEDURE WRITEMIXES(MIXES:INTEGER);
  649. X
  650. XBEGIN
  651. X  POSITION(70,50);
  652. X  WRITELN('T''Mixes : ',MIXES:1,' '' ');
  653. XEND;
  654. X
  655. X(******************************************************************************)
  656. X
  657. XPROCEDURE DRAWSCREEN;
  658. X
  659. XBEGIN
  660. X  REGIS;
  661. X  Writeln('s(m0(ad)m1(ar)m2(ab)m3(ay))');
  662. X  WRITELN('S(C0)');
  663. X  WRITELN('S(E)');
  664. X  POSITION(50,600);
  665. X  WRITELN('T''Side to move : '' ');
  666. X  POSITION(70,620);
  667. X  WRITELN('T''U = Up'' ');
  668. X  POSITION(90,620);
  669. X  WRITELN('T''D = Down'' ');
  670. X  POSITION(110,620);
  671. X  WRITELN('T''R = Right'' ');
  672. X  POSITION(130,620);
  673. X  WRITELN('T''L = Left'' ');
  674. X  POSITION(150,620);
  675. X  WRITELN('T''F = Front'' ');
  676. X  POSITION(170,620);
  677. X  WRITELN('T''B = Back'' ');
  678. X  POSITION(200,600);
  679. X  WRITELN('T''Direction : '' ');
  680. X  POSITION(220,620);
  681. X  WRITELN('T''+ = +  90 Degrees'' ');
  682. X  POSITION(240,620);
  683. X  WRITELN('T''- = -  90 Degrees'' ');
  684. X  POSITION(260,620);
  685. X  WRITELN('T''2 =   180 Degrees'' ');
  686. X  POSITION(290,600);
  687. X  WRITELN('T''Other Commands : '' ');
  688. X  POSITION(310,620);
  689. X  WRITELN('T''CTRL-F = Fix Cube'' ');
  690. X  POSITION(330,620);
  691. X  WRITELN('T''CTRL-J = Jumble Cube'' ');
  692. X  POSITION(350,620);
  693. X  WRITELN('T''CTRL-L = Load Game'' ');
  694. X  POSITION(370,620);
  695. X  WRITELN('T''CTRL-H = Save Game'' ');
  696. X  POSITION(390,620);
  697. X  WRITELN('T''CTRL-W = Screen Refresh'' ');
  698. X  POSITION(410,620);
  699. X  WRITELN('T''CTRL-Z = Quit Game'' ');
  700. X  POSITION(430,620);
  701. X  WRITELN('T''Arrow Keys = Rotate'' ');
  702. X  WRITEMIXES(MIXES);
  703. X  WRITEMOVES(MOVES);
  704. X  DRAWCUBE;
  705. XEND;
  706. X
  707. X(******************************************************************************)
  708. X
  709. XPROCEDURE CHECKCUBE(VAR DONE:BOOLEAN);
  710. X
  711. XVAR
  712. X  I:INTEGER;
  713. X
  714. XBEGIN
  715. X  DONE := TRUE;
  716. X  FOR I := 1 TO 9 DO BEGIN
  717. X    IF (CUBEARRAY[UP][I]    <> CUBEARRAY[UP][5])    THEN DONE := FALSE;
  718. X    IF (CUBEARRAY[DOWN][I]  <> CUBEARRAY[DOWN][5])  THEN DONE := FALSE;
  719. X    IF (CUBEARRAY[RIGHT][I] <> CUBEARRAY[RIGHT][5]) THEN DONE := FALSE;
  720. X    IF (CUBEARRAY[LEFT][I]  <> CUBEARRAY[LEFT][5])  THEN DONE := FALSE;
  721. X    IF (CUBEARRAY[FRONT][I] <> CUBEARRAY[FRONT][5]) THEN DONE := FALSE;
  722. X    IF (CUBEARRAY[BACK][I]  <> CUBEARRAY[BACK][5])  THEN DONE := FALSE;
  723. X    END;
  724. XEND;
  725. X
  726. X(******************************************************************************)
  727. X
  728. XPROCEDURE ESCAPE(VAR KEY:CHAR);
  729. X
  730. XVAR 
  731. X  KEY2,
  732. X  KEY3:CHAR;
  733. X
  734. XBEGIN
  735. X  KEY2 := ' ';
  736. X  KEY3 := ' ';
  737. X  KEY2 := GETKEY;
  738. X  IF (KEY2 = CHR(63)) OR (KEY2 = CHR(79)) THEN 
  739. X    BEGIN
  740. X      KEY3 := GETKEY;
  741. X      CASE KEY3 OF 
  742. X        CHR(108) : KEY := ',';
  743. X        CHR(109) : KEY := '-';
  744. X        CHR(112) : KEY := '0';
  745. X        CHR(113) : KEY := '1';
  746. X        CHR(114) : KEY := '2';
  747. X        CHR(115) : KEY := '3';
  748. X        CHR(116) : KEY := '4';
  749. X        CHR(117) : KEY := '5';
  750. X        CHR(118) : KEY := '6';
  751. X        CHR(119) : KEY := '7';
  752. X        CHR(120) : KEY := '8';
  753. X        CHR(121) : KEY := '9';
  754. X        END;
  755. X      END;
  756. X    IF (KEY2 = CHR(91)) THEN BEGIN
  757. X      KEY3 := GETKEY;
  758. X      CASE KEY3 OF
  759. X        CHR(65) : TURNCUBE(CUBEARRAY,UP);
  760. X        CHR(66) : TURNCUBE(CUBEARRAY,DOWN);
  761. X        CHR(67) : TURNCUBE(CUBEARRAY,RIGHT);
  762. X        CHR(68) : TURNCUBE(CUBEARRAY,LEFT);
  763. X        END;
  764. X      END;
  765. XEND;
  766. X
  767. X(******************************************************************************)
  768. X
  769. XPROCEDURE MESSCUBE(VAR CUBEARRAY:CUBES);
  770. X
  771. XVAR
  772. X  DONE:BOOLEAN;
  773. X  TEMP,
  774. X  RANDOM2,
  775. X  RANDOM3:INTEGER;
  776. X  RANDOMTURN:ROTATE;
  777. X
  778. XBEGIN
  779. X  FOR I := 1 TO 40 DO BEGIN
  780. X    DONE := FALSE;
  781. X    REPEAT
  782. X      RANDOMNUMBER(RANDOM2,1,6);
  783. X      CASE RANDOM2 OF
  784. X        1 : BEGIN
  785. X              IF (RANDOM2 <> TEMP) AND (TEMP <> 2) THEN
  786. X                RANDOMTURN := FRONT;
  787. X              DONE := TRUE;
  788. X              END;
  789. X        2 : BEGIN
  790. X              IF (RANDOM2 <> TEMP) AND (TEMP <> 1) THEN
  791. X                RANDOMTURN := BACK;
  792. X              DONE := TRUE;
  793. X              END;
  794. X        3 : BEGIN
  795. X              IF (RANDOM2 <> TEMP) AND (TEMP <> 4) THEN
  796. X                RANDOMTURN := LEFT;
  797. X              DONE := TRUE;
  798. X              END;
  799. X        4 : BEGIN
  800. X              IF (RANDOM2 <> TEMP) AND (TEMP <> 3) THEN
  801. X                RANDOMTURN := RIGHT;
  802. X              DONE := TRUE;
  803. X              END;
  804. X        5 : BEGIN
  805. X              IF (RANDOM2 <> TEMP) AND (TEMP <> 6) THEN
  806. X                RANDOMTURN := UP;
  807. X              DONE := TRUE;
  808. X              END;
  809. X        6 : BEGIN
  810. X              IF (RANDOM2 <> TEMP) AND (TEMP <> 5) THEN
  811. X                RANDOMTURN := DOWN;
  812. X              DONE := TRUE;
  813. X              END;
  814. X        END
  815. X      UNTIL DONE;
  816. X    RANDOMNUMBER(RANDOM3,1,2);
  817. X    IF RANDOM3 = 2 THEN
  818. X      RANDOM3 := 3;
  819. X    CHANGEARRAY(CUBEARRAY,RANDOMTURN,RANDOM3);
  820. X    TEMP := RANDOM2;
  821. X    END;
  822. XEND;
  823. X
  824. X(******************************************************************************)
  825. X
  826. XPROCEDURE TYPED(VAR TURN:ROTATE;VAR DIR:INTEGER;VAR DONE:BOOLEAN;VAR 
  827. X                MOVES:INTEGER);
  828. X
  829. XBEGIN
  830. X  TURN := NONE;
  831. X  REPEAT
  832. X    KEY := GETKEY;
  833. X    IF (KEY = CHR(27)) THEN ESCAPE(KEY);
  834. X    CASE KEY OF
  835. X      CHR(6)       : BEGIN
  836. X                       TURN := NONE;
  837. X                       INITIALIZE(CUBEARRAY,MIXES,MOVES,SCORE);
  838. X                       DRAWCUBE;
  839. X                       END;
  840. X      CHR(10)      : BEGIN
  841. X                      MESSCUBE(CUBEARRAY);
  842. X                      MESSCUBE(CUBEARRAY);
  843. X                      MIXES := MIXES +1;
  844. X                      DRAWCUBE;
  845. X                      WRITEMIXES(MIXES);
  846. X                      TURN := NONE;
  847. X                      END;
  848. X      CHR(8)      : BEGIN
  849. X                      SAVECUBE;
  850. X                      END;
  851. X      CHR(12)     : BEGIN
  852. X                      LOADCUBE(CUBEARRAY,MOVES,MIXES);
  853. X                      DRAWCUBE;
  854. X                      WRITEMOVES(MOVES);
  855. X                      WRITEMIXES(MIXES);
  856. X                      TURN := NONE;
  857. X                      END;
  858. X      CHR(26)     : DONE := TRUE;
  859. X      CHR(23)     : DRAWSCREEN;
  860. X      'R','r','6' : TURN := RIGHT;
  861. X      'L','l','4' : TURN := LEFT;
  862. X      'F','f','5' : TURN := FRONT;
  863. X      'B','b','9' : TURN := BACK;
  864. X      'U','u','8' : TURN := UP;
  865. X      'D','d','2' : TURN := DOWN
  866. X    OTHERWISE
  867. X      TURN := NONE;
  868. X      END;
  869. X  UNTIL (TURN <> NONE) OR (KEY = CHR(23)) OR (KEY = CHR(26)) OR 
  870. X        (KEY = CHR(8)) OR (KEY = CHR(12));
  871. X  DIR := 0;
  872. X  IF (KEY <> CHR(23)) AND (KEY <> CHR(26))  AND 
  873. X     (KEY <> CHR(8)) AND (KEY <> CHR(12)) THEN REPEAT
  874. X    KEY := GETKEY;
  875. X    IF (KEY = CHR(27)) THEN ESCAPE(KEY);
  876. X    CASE KEY OF
  877. X      '+',',' : DIR := 1;
  878. X      '2'     : DIR := 2;
  879. X      '-'     : DIR := 3
  880. X    OTHERWISE
  881. X      DIR := 0;
  882. X      END
  883. X    UNTIL (DIR <> 0);  
  884. X  IF (DIR <> 0) THEN MOVES := MOVES + 1;
  885. XEND;
  886. X
  887. X(******************************************************************************)
  888. X
  889. X(* MAIN *)
  890. X
  891. XBEGIN
  892. X  OPENKEY;
  893. X  KEY   := ' ';
  894. X  I := 0;
  895. X    REGIS;
  896. X    WRITELN('T(A0)');
  897. X    DRAWSCREEN;
  898. X    QUIT := FALSE;
  899. X    WHILE NOT(DONE) AND NOT(QUIT) DO BEGIN
  900. X      I := 0;
  901. X      TYPED(TURN,DIR,QUIT,MOVES);
  902. X      CHANGEARRAY(CUBEARRAY,TURN,DIR);
  903. X      SIDES(TURN);
  904. X      WRITEMOVES(MOVES);
  905. X  (*    CHECKCUBE(DONE);*)
  906. X      END;
  907. X  IF DONE THEN BEGIN
  908. X    END;
  909. X  SHUTKEY;
  910. X  ASCII;
  911. XEND.
  912. END_OF_cube.pas
  913. if test 25565 -ne `wc -c <cube.pas`; then
  914.     echo shar: \"cube.pas\" unpacked with wrong size!
  915. fi
  916. # end of overwriting check
  917. fi
  918. echo shar: End of shell archive.
  919. exit 0
  920.